package co.gov.medellin.ssti.sub.common.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

import co.gov.medellin.ssti.sub.common.util.Atributo;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.dao.impl.BaseDAOImpl;
import co.gov.medellin.ssti.sub.model.vo.AreaVO;
import co.gov.medellin.ssti.sub.model.vo.ProgramaVO;
import co.gov.medellin.ssti.sub.model.vo.SedeVO;
import co.gov.medellin.ssti.sub.model.vo.SubprogramaVO;
import co.gov.medellin.ssti.sub.model.vo.ValorFlexibleVO;
import co.gov.medellin.ssti.sub.model.vo.VflexVO;
import co.gov.medellin.ssti.sub.paoyer.administration.model.vo.UserVO;

public class Consultas extends BaseDAOImpl {

	public Consultas(Connection con) {
		super(con);
	}

	public Collection<ProgramaVO> getDetPrograma(String strcodigo) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strSql = " SELECT pgr.NOMBRE Nombre, nvl(pgr.OBJETIVO,' ') Objetivo, "
				+ " nvl(pgr.DESCRIPCION,' ') Descripcion, nvl(area.NOMBRE,' ') Area, "
				+ " usu.codigo codusu, usu.NOMBRE Usuario, nvl(pgr.POBLACION_OBJETIVO,' ') Poblacion, "
				+ " nvl(to_char(pgr.desde_vigencia,'dd/mm/yyyy'),'nulo') Desde, "
				+ " nvl(to_char(pgr.hasta_vigencia,'dd/mm/yyyy'),'nulo')  Hasta, nvl(pgr.VIGENCIA,' ') Vigencia, "
				+ " pgr.CAMPO_A4 CAMPO_A4 "
				+ " FROM TCS_BEN_PROGRAMA pgr, TCS_BEN_AREA area, paoyer.tcs_usuario usu "
				+ " WHERE pgr.AREA_CODIGO = area.CODIGO "
				+ " AND pgr.USU_CODIGO = usu.CODIGO AND pgr.CODIGO = ? ";
		Collection<ProgramaVO> detPrograma = new ArrayList<ProgramaVO>();

		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setString(1, strcodigo);
			rst = pstmt.executeQuery();
			while (rst.next()) {
				ProgramaVO det = new ProgramaVO();
				det.setNombre(rst.getString("Nombre"));
				det.setObjetivo(rst.getString("Objetivo"));
				det.setDescripcion(rst.getString("Descripcion"));
				det.setNombreArea(rst.getString("Area"));
				det.setCodeUsuario(rst.getLong("codusu"));
				det.setNombreUsuario(rst.getString("Usuario"));
				det.setPoblacionObjetivo(rst.getString("Poblacion"));
				det.setDesdeVigencia(rst.getString("Desde"));
				det.setHastaVigencia(rst.getString("Hasta"));
				det.setVigencia(rst.getString("Vigencia"));
				det.setCampoA4(rst.getString("CAMPO_A4"));
				detPrograma.add(det);
			}
			return detPrograma;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}

	}

	public Collection<SubprogramaVO> getDetSubpgr(String strsubpgr) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strSql = " SELECT subpgr.nombre subprograma, pgr.NOMBRE programa,area.codigo codsecr, area.NOMBRE secretaria, nvl(subpgr.DESCRIPCION,' ') descripcion, "
				+ " nvl(TO_CHAR(subpgr.DIAS_REUTILIZAR),' ') utilizacion, nvl(subpgr.VALOR_UNITARIO_BENEFICIO,'0') valor, "
				+ " nvl(to_char(subpgr.desde_vigencia,'yyyy-mm-dd'),'nulo') desde, nvl(to_char(subpgr.hasta_vigencia,'yyyy-mm-dd'),'nulo') hasta, "
				+ " subpgr.grupo_familiar grupo, subpgr.validar_contra_estud estudiantes, "
				+ " subpgr.validar_contra_sisben sisben,  subpgr.VIGENCIA vigencia, usu.codigo codadmin, usu.NOMBRE usuario, "
				+ " subpgr.area_codigo subsecretaria,nvl(subpgr.CAMPO_A3,' ') renovar "
				+ " FROM TCS_BEN_SUBPROGRAMA subpgr, TCS_BEN_PROGRAMA pgr, TCS_BEN_AREA area, paoyer.tcs_usuario usu "
				+ " WHERE area.CODIGO = pgr.AREA_CODIGO AND usu.CODIGO = subpgr.USU_CODIGO "
				+ " AND pgr.CODIGO = subpgr.PRG_CODIGO AND subpgr.codigo = ? ";
		Collection<SubprogramaVO> detSubprograma = new ArrayList<SubprogramaVO>();
		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setString(1, strsubpgr);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				SubprogramaVO subprogramaVO = new SubprogramaVO();
				subprogramaVO.setNombre(rst.getString("subprograma"));
				subprogramaVO.setNombrePrograma(rst.getString("programa"));
				subprogramaVO.setCodeArea(rst.getLong("codsecr"));
				subprogramaVO.setNombreArea(rst.getString("secretaria"));
				subprogramaVO.setDescripcion(rst.getString("descripcion"));
				subprogramaVO.setDiasReutilizar(rst.getString("utilizacion"));
				subprogramaVO.setValorUnitarioBeneficio(rst.getString("valor"));
				subprogramaVO.setDesdeVigencia(rst.getString("desde"));
				subprogramaVO.setHastaVigencia(rst.getString("hasta"));
				subprogramaVO.setGrupoFamiliar(rst.getString("grupo"));
				subprogramaVO.setValidarEstud(rst.getString("estudiantes"));
				subprogramaVO.setValidarSisben(rst.getString("sisben"));
				subprogramaVO.setVigencia(rst.getString("vigencia"));
				subprogramaVO.setCodeUsuario(rst.getLong("codadmin"));
				subprogramaVO.setNombreUsuario(rst.getString("usuario"));
				subprogramaVO.setCodeArea(rst.getLong("subsecretaria"));
				// TODO: ???
				subprogramaVO.setDiasRenovacion(rst.getString("renovar"));

				detSubprograma.add(subprogramaVO);
			}
			return detSubprograma;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public Collection<SedeVO> getDetSede(String strSede) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strSql = " SELECT sede.Nombre nombre, NVL(sede.Descripcion,' ') descripcion,  "
				+ " nvl(sede.tipo,' ') tipo, nvl(sede.caracter,' ') car, "
				+ " vfl_codigo_municipio.CODIGO  Municipio, nvl(sede.Direccion_Descriptiva,' ') dirdescrip, "
				+ " sede.Direccion_Encasillada direncas,nvl(sede.localizacion_cobama,' ')cobama, "
				+ " nvl(to_char(sede.desde_vigencia,'dd/mm/yyyy'),'nulo') desde, "
				+ " nvl(to_char(sede.hasta_vigencia,'dd/mm/yyyy'),'nulo') hasta, sede.vigencia vig "
				+ " FROM TCS_BEN_SEDE sede, paoyer.tcs_valor_flexible vfl_codigo_municipio "
				+ " WHERE sede.VFL_CODIGO_MUNICIPIO = vfl_codigo_municipio.CODIGO AND sede.codigo = ? ";

		Collection<SedeVO> sedes = new ArrayList<SedeVO>();

		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setString(1, strSede);
			rst = pstmt.executeQuery();

			if (rst.next()) {
				SedeVO sedeVO = new SedeVO();
				sedeVO.setNombre(rst.getString("nombre"));
				sedeVO.setDescripcion(rst.getString("descripcion"));
				sedeVO.setTipo(rst.getString("tipo"));
				sedeVO.setCaracter(rst.getString("car"));
				sedeVO.setCodeMunicipio(rst.getLong("Municipio"));
				sedeVO.setDireccion_descriptiva(rst.getString("dirdescrip"));
				sedeVO.setDireccion_encasillada(rst.getString("direncas"));
				sedeVO.setLocalizacion_cobama(rst.getString("cobama"));
				sedeVO.setDesde(rst.getString("desde"));
				sedeVO.setHasta(rst.getString("hasta"));
				sedeVO.setVigencia(rst.getString("vig"));

				sedes.add(sedeVO);
			}
			return sedes;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	// TODO: metodo posiblemente existe ya en programaDAO. no existe, pasarlo
	// para esa interf.
	public Collection<ProgramaVO> getNamePrograma(Long codeUser,
			String groupUserName, Long areaUser) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		StringBuffer query = new StringBuffer(
				"SELECT DISTINCT COD_PROGRAMA, NOM_PROGRAMA, DESC_PROGRAMA, OBJETIVO, POBLACION_OBJETIVO, COD_AREA, NOM_AREA, COD_USUARIO, NOM_USUARIO FROM VCS_BEN_PROG_WITHOUT_USUSEDE  ");
		Collection<ProgramaVO> programas = new ArrayList<ProgramaVO>();
		List<Object> parameters = new ArrayList<Object>();

		if ((Object) codeUser != null) {
			query.append(" WHERE ('ADMINISTRADOR GENERAL' = ? "
					+ " OR 'SUPER USUARIO' = ? OR admSubpro = ? "
					+ " OR admProg = ? ");
			parameters.add(groupUserName);
			parameters.add(groupUserName);
			parameters.add(codeUser);
			parameters.add(codeUser);
			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				query.append(" OR COD_AREA = ? ");
				parameters.add(areaUser);
			}
			query.append(" ) ");
		}
		query.append(" ORDER BY NOM_PROGRAMA");
		System.out.println(query);
		for (Object o : parameters) {
			System.out.println(o);
		}
		try {
			pstmt = conn.prepareStatement(query.toString());
			pstmt = setQueryParameters(pstmt, parameters);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				ProgramaVO programaVO = new ProgramaVO();
				programaVO.setCode(rst.getLong("COD_PROGRAMA"));
				programaVO.setNombre(rst.getString("NOM_PROGRAMA"));
				programaVO.setDescripcion(rst.getString("DESC_PROGRAMA"));
				programaVO.setObjetivo(rst.getString("OBJETIVO"));
				programaVO.setPoblacionObjetivo(rst
						.getString("POBLACION_OBJETIVO"));
				programaVO.setCodeArea(rst.getLong("COD_AREA"));
				programaVO.setNombreArea(rst.getString("NOM_AREA"));
				programaVO.setCodeUsuario(rst.getLong("COD_USUARIO"));
				programaVO.setNombreUsuario(rst.getString("NOM_USUARIO"));

				programas.add(programaVO);
			}
			return programas;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}

	}

	public Collection<AreaVO> getNomSubsecretaria(String strcodsecret) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strSql = " SELECT codigo, nombre FROM TCS_BEN_AREA WHERE area_codigo = ? ";
		Collection<AreaVO> areas = new ArrayList<AreaVO>();

		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setString(1, strcodsecret);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				AreaVO areaVO = new AreaVO();
				areaVO.setCode(rst.getLong("codigo"));
				areaVO.setNombre(rst.getString("nombre"));

				areas.add(areaVO);
			}
			return areas;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public Collection<UserVO> getUsuAdmin(String strusu) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String codUsu = "%" + strusu + "%";

		String strSql = "SELECT usu.codigo codigo, usu.nombre usuario, usu.descripcion nombre "
				+ " FROM paoyer.tcs_usuario usu, paoyer.tcs_grupo_usuario gusu "
				+ " WHERE usu.gus_codigo = gusu.codigo "
				+ "	AND fcs_val_vigencia(usu.vigencia, usu.desde_vigencia, usu.hasta_vigencia) = 'S' "
				+ "	AND usu.campo_a1 IS NULL "
				+ "	AND (usu.nombre LIKE upper(?) OR usu.descripcion LIKE upper(?))";
		Collection<UserVO> usuarios = new ArrayList<UserVO>();

		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setString(1, codUsu);
			pstmt.setString(2, codUsu);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				UserVO userVO = new UserVO();
				userVO.setCode(rst.getLong("codigo"));
				userVO.setName(rst.getString("usuario"));
				userVO.setDescription(rst.getString("nombre"));

				usuarios.add(userVO);
			}
			return usuarios;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public Collection<VflexVO> getMunicipios() {
		Statement stmt = null;
		ResultSet rst = null;

		String strSql = " SELECT nombre,codigo FROM paoyer.TCS_VALOR_FLEXIBLE WHERE campo_a1 = '05' ";
		Collection<VflexVO> vflexVOs = new ArrayList<VflexVO>();

		try {
			stmt = conn.createStatement();
			rst = stmt.executeQuery(strSql);

			while (rst.next()) {
				VflexVO vflexVO = new VflexVO();
				vflexVO.setNombreVflex(rst.getString("nombre"));
				vflexVO.setCode(rst.getLong("codigo"));

				vflexVOs.add(vflexVO);
			}
			return vflexVOs;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, stmt);
		}
	}

	public int getActivarSub2(String[] param) {
		PreparedStatement pstmt = null;

		String strSql = "UPDATE tcs_ben_subprograma "
				+ " SET vigencia = 'A', comentario = '', hasta_vigencia=hasta_vigencia+TO_NUMBER(hasta_vigencia-desde_vigencia), "
				+ " USUARIO_MODIFICA = ?, FECHA_MODIFICA = TO_DATE(?,'dd/mm/yyyy'), "
				+ " TERMINAL_MODIFICA = ? WHERE codigo = ? ";

		try {
			pstmt = conn.prepareStatement(strSql);
			List<String> parameters = Arrays.asList(param);
			pstmt = setQueryParameters(pstmt, parameters);

			return pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
	}

	public int getActivarPro2(String[] param) {
		PreparedStatement pstmt = null;

		String strSql = "UPDATE tcs_ben_programa SET vigencia = 'A' , comentario = '', "
				+ " USUARIO_MODIFICA = ?, FECHA_MODIFICA = TO_DATE(?,'dd/mm/yyyy'), "
				+ " TERMINAL_MODIFICA = ? WHERE codigo = ? ";
		List<String> parameters = Arrays.asList(param);
		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt = setQueryParameters(pstmt, parameters);

			return pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
	}

	public Collection<String> getNomPrg(String strcodpro) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strSql = "SELECT nombre FROM tcs_ben_programa WHERE codigo = ? ";
		Collection<String> noms = new ArrayList<String>();
		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setString(1, strcodpro);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				noms.add(rst.getString("nombre"));
			}
			return noms;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public Collection<SubprogramaVO> getInfoact(String strsubprog) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strSql = " SELECT  sub.PRG_CODIGO codprog,prog.NOMBRE programa, sub.nombre subprograma"
				+ " FROM TCS_BEN_SUBPROGRAMA sub, TCS_BEN_PROGRAMA prog "
				+ " WHERE prog.VIGENCIA = 'I' AND sub.PRG_CODIGO = prog.CODIGO "
				+ " AND sub.CODIGO = ? ";
		Collection<SubprogramaVO> subprogramaVOs = new ArrayList<SubprogramaVO>();

		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setString(1, strsubprog);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				SubprogramaVO subprogramaVO = new SubprogramaVO();
				subprogramaVO.setCodePrograma(rst.getLong("codprog"));
				subprogramaVO.setNombrePrograma(rst.getString("programa"));
				subprogramaVO.setNombre(rst.getString("subprograma"));

				subprogramaVOs.add(subprogramaVO);
			}
			return subprogramaVOs;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public boolean valProgActivo(String strsubprg) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strSql = " SELECT prog.NOMBRE programa, sub.nombre subprograma"
				+ " FROM TCS_BEN_SUBPROGRAMA sub, TCS_BEN_PROGRAMA prog "
				+ " WHERE prog.VIGENCIA = 'I' AND sub.PRG_CODIGO = prog.CODIGO "
				+ " AND sub.CODIGO = ? ";

		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setString(1, strsubprg);
			rst = pstmt.executeQuery();

			return rst.next();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public Collection<SubprogramaVO> getInfoact2(String strsubprog) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strSql = " SELECT prog.NOMBRE programa, sub.nombre subprograma "
				+ " FROM TCS_BEN_SUBPROGRAMA sub, TCS_BEN_PROGRAMA prog  "
				+ " WHERE  sub.PRG_CODIGO = prog.CODIGO "
				+ " AND sub.CODIGO = ? ";

		Collection<SubprogramaVO> subprogramaVOs = new ArrayList<SubprogramaVO>();

		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setString(1, strsubprog);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				SubprogramaVO subprogramaVO = new SubprogramaVO();
				subprogramaVO.setNombrePrograma(rst.getString("programa"));
				subprogramaVO.setNombre(rst.getString("subprograma"));

				subprogramaVOs.add(subprogramaVO);
			}
			return subprogramaVOs;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public String Nombre(String strCod) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strSQL = "SELECT ETIQUETA FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE CODIGO = ? ";
		int codigo = Integer.parseInt(strCod.trim());

		try {
			pstmt = conn.prepareStatement(strSQL);
			pstmt.setInt(1, codigo);
			rst = pstmt.executeQuery();

			if (rst.next()) {
				return rst.getString("ETIQUETA");
			} else {
				// TODO: throw no existe exception.
				throw new DAOException("");
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public int ObtenerCodAtriEspe(String strCod) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strSQL = "SELECT CAMPO_A1 FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE CODIGO = ? ";
		int codigo = Integer.parseInt(strCod.trim());
		int iCod = 0;

		try {
			pstmt = conn.prepareStatement(strSQL);
			pstmt.setInt(1, codigo);
			rst = pstmt.executeQuery();

			if (rst.next()) {
				iCod = rst.getInt("CAMPO_A1");
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return iCod;
	}

	public int getlistaGeneral(String strCod) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strSQL = "SELECT CODIGO FROM TCS_BEN_ATR_GENERICO WHERE TTVF_CODIGO_DOMINIO = ? ";
		int codigo = Integer.parseInt(strCod.trim());
		int iCod = 0;

		try {
			pstmt = conn.prepareStatement(strSQL);
			pstmt.setInt(1, codigo);
			rst = pstmt.executeQuery();

			if (rst.next()) {
				iCod = 1;
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return iCod;
	}

	public Collection<Atributo> getAtributoGenerico(String codsub)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		int validar = ValidarEstudiante(codsub);
		int subprograma = Integer.parseInt(codsub.trim());
		List<Atributo> listaAtri = new ArrayList<Atributo>();
		String strSQL = "";

		if (validar == 1) {
			strSQL = "SELECT GEN.NOMBRE ATGNOMBRE, GEN.CODIGO ATGCODIGO, GEN.ETIQUETA ATGETIQUETA "
					+ " FROM TCS_BEN_ATR_GENERICO GEN "
					+ " WHERE  "
					+ " GEN.NOMBRE NOT IN (SELECT NOMBRE FROM TCS_BEN_SUBP_ATR_BENEFICIARIO "
					+ " WHERE SBPR_CODIGO = ? ) ORDER BY GEN.ORDEN";
		} else {
			strSQL = "SELECT GEN.NOMBRE ATGNOMBRE, GEN.CODIGO ATGCODIGO, GEN.ETIQUETA ATGETIQUETA "
					+ " FROM TCS_BEN_ATR_GENERICO GEN "
					+ " WHERE  "
					+ " GEN.NOMBRE NOT IN (SELECT NOMBRE FROM TCS_BEN_SUBP_ATR_BENEFICIARIO "
					+ " WHERE SBPR_CODIGO = ? "
					+ " ) "
					+ " AND (CAMPO_A2 IS NULL or CAMPO_A2 = 'S')  "
					+ " ORDER BY GEN.ORDEN";
		}

		try {
			pstmt = conn.prepareStatement(strSQL);
			pstmt.setInt(1, subprograma);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				Atributo a = new Atributo();
				a.setCodigo(rst.getString("ATGCODIGO"));
				a.setNombre(rst.getString("ATGNOMBRE"));
				a.setEtiqueta(rst.getString("ATGETIQUETA"));
				listaAtri.add(a);
			}
			return listaAtri;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	/**
	 * Metodo DEPRECADO ya no se usa para validar contra matricula en linea,
	 * siempre retorna 0.
	 * 
	 * @param codsubpro
	 * @return
	 */
	public int ValidarEstudiante(String codsubpro) {
		// int retorno = 0;
		// int subprograma = Integer.parseInt(codsubpro.trim());
		// String strSQL =
		// "SELECT NOMBRE FROM TCS_BEN_SUBPROGRAMA WHERE CODIGO=" + subprograma
		// + " " + "AND VALIDAR_CONTRA_ESTUD='S'";
		//
		// ResultSet rs = null;
		// try {
		// rs = cf.getRecordsRset(strSQL, null, conn);
		// if (rs.next()) {
		// retorno = 1;
		// }
		// } catch (SQLException e) {
		// System.err.println("/******** TDSUB - cwsub");
		// e.printStackTrace();
		// System.err.println("TDSSPE - cwsub ********/");
		// } finally {
		// if (rs != null) {
		// try { rs.close(); } catch (SQLException e) {
		// System.err.println("/******** TDSUB - cwsub");
		// e.printStackTrace();
		// System.err.println("TDSSPE - cwsub ********/");
		// }
		// }
		// }

		return 0;
	}

	public Collection<Atributo> getAtributoEspecificos(String strSubprograma,
			int opcion) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		int sub = Integer.parseInt(strSubprograma.trim());
		String strSQL;
		List<Atributo> listaAtriEsp = new ArrayList<Atributo>();

		if (opcion != 1) {
			strSQL = "SELECT CODIGO, TIPO_ATRIBUTO, NOMBRE, nvl(REST_CODIGO,'0') REST_CODIGO, ORDEN, LONGITUD, "
					+ " OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, VALIDAR_LISTA, VIGENCIA, "
					+ " DESCRIPCION, TIPO_DATO, TTVF_CODIGO_DOMINIO "
					+ " FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE CODIGO = ? ";
		} else {
			strSQL = "SELECT CODIGO, TIPO_ATRIBUTO, NOMBRE, nvl(REST_CODIGO,'0') REST_CODIGO, ORDEN, LONGITUD, "
					+ " OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, VALIDAR_LISTA, VIGENCIA, "
					+ " DESCRIPCION, TIPO_DATO, TTVF_CODIGO_DOMINIO "
					+ " FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE SBPR_CODIGO = ? AND VIGENCIA = 'A' ORDER BY ORDEN";
		}

		try {
			pstmt = conn.prepareStatement(strSQL);
			pstmt.setInt(1, sub);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				Atributo a1 = new Atributo();
				int res = rst.getInt("TTVF_CODIGO_DOMINIO");
				if (res != 0) {
					a1.setTipovalorflex(rst.getString("TTVF_CODIGO_DOMINIO"));
				} else {
					a1.setTipovalorflex("");
				}

				a1.setCodigo(rst.getString("CODIGO"));
				a1.setNombre(rst.getString("NOMBRE"));
				a1.setEtiqueta(rst.getString("ETIQUETA"));
				a1.setOrden(rst.getString("ORDEN"));
				a1.setRestriccion(rst.getString("REST_CODIGO"));
				a1.setValLista(rst.getString("VALIDAR_LISTA"));
				if (a1.getValLista().equals("S")) {
					a1.setValListaDesc("Si");
				} else {
					a1.setValListaDesc("No");
				}
				a1.setLongitud(rst.getString("LONGITUD"));

				a1.setObligatorio(rst.getString("OBLIGATORIO"));
				if (a1.getObligatorio().equals("S")) {
					a1.setObligarioDesc("Si");
				} else {
					a1.setObligarioDesc("No");
				}

				a1.setTipoatributo(rst.getString("TIPO_ATRIBUTO"));
				if (a1.getTipoatributo().equals("R")) {
					a1.setTipoatributoDesc("Beneficiario");
				} else {
					a1.setTipoatributoDesc("Beneficio");
				}

				a1.setValorsugerido(rst.getString("VALOR_SUGERIDO"));
				a1.setVigencia(rst.getString("VIGENCIA"));
				if (a1.getVigencia().equals("A")) {
					a1.setVigenciaDesc("Activo");
				} else {
					a1.setVigenciaDesc("Inactivo");
				}

				a1.setTipodato(rst.getString("TIPO_DATO"));
				if (a1.getTipodato().equals("A")) {
					a1.setTipodatoDesc("Alfanumerico");
				} else {
					if (a1.getTipodato().equals("F")) {
						a1.setTipodatoDesc("Fecha");
					} else {
						if (a1.getTipodato().equals("N")) {
							a1.setTipodatoDesc("Numérico");
						} else {
							a1.setTipodatoDesc("Solo Letras (A-Z)");
						}
					}

				}
				a1.setDescripcion(rst.getString("DESCRIPCION"));

				listaAtriEsp.add(a1);
			}
			return listaAtriEsp;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public Collection<ValorFlexibleVO> getDominio(String tipovfl) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		int dominio = Integer.parseInt(tipovfl.trim());
		List<ValorFlexibleVO> listaDominio = new ArrayList<ValorFlexibleVO>();

		String strSQL = "SELECT TCS_VALOR_FLEXIBLE.CODIGO CODIGOVFL, TCS_TIPO_VALOR_FLEX.CODIGO TVFCOD, "
				+ " TCS_TIPO_VALOR_FLEX.DESCRIPCION TVFDES, TCS_TIPO_VALOR_FLEX.VIGENCIA TVFVIG, "
				+ " TCS_VALOR_FLEXIBLE.DESCRIPCION VFDES, TCS_VALOR_FLEXIBLE.TVF_CODIGO VFTVFCOD, "
				+ " TCS_VALOR_FLEXIBLE.CODIGO_VALOR CODIGO_VALOR "
				+ " FROM paoyer.TCS_TIPO_VALOR_FLEX, paoyer.TCS_VALOR_FLEXIBLE "
				+ " WHERE TCS_TIPO_VALOR_FLEX.CODIGO = ? AND TCS_VALOR_FLEXIBLE.TVF_CODIGO = ? "
				+ " AND TCS_VALOR_FLEXIBLE.VIGENCIA='S' "
				+ " ORDER BY CODIGO_VALOR ";

		try {
			pstmt = conn.prepareStatement(strSQL);
			pstmt.setInt(1, dominio);
			pstmt.setInt(2, dominio);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				ValorFlexibleVO valorfl = new ValorFlexibleVO();
				valorfl.setCodigotvfl(rst.getString("TVFCOD"));
				valorfl.settVFCodigo(rst.getString("VFTVFCOD"));
				valorfl.setDescripciontvfl(rst.getString("TVFDES"));
				valorfl.setDescripcionvf(rst.getString("VFDES"));
				valorfl.setVigenciatvfl(rst.getString("TVFVIG"));
				valorfl.setCodigovfl(rst.getString("CODIGOVFL"));
				valorfl.setCodigoValor(rst.getString("CODIGO_VALOR"));

				listaDominio.add(valorfl);
			}
			return listaDominio;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public Collection<ValorFlexibleVO> getDominioByCritera(String tipovfl,
			String nombre) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		int dominio = Integer.parseInt(tipovfl.trim());
		List<ValorFlexibleVO> listaDominio = new ArrayList<ValorFlexibleVO>();

		String strSQL = "SELECT TCS_VALOR_FLEXIBLE.CODIGO CODIGOVFL, TCS_TIPO_VALOR_FLEX.CODIGO TVFCOD, "
				+ " TCS_TIPO_VALOR_FLEX.DESCRIPCION TVFDES, TCS_TIPO_VALOR_FLEX.VIGENCIA TVFVIG, "
				+ " TCS_VALOR_FLEXIBLE.DESCRIPCION VFDES, TCS_VALOR_FLEXIBLE.TVF_CODIGO VFTVFCOD, "
				+ " TCS_VALOR_FLEXIBLE.CODIGO_VALOR CODIGO_VALOR "
				+ " FROM paoyer.TCS_TIPO_VALOR_FLEX, paoyer.TCS_VALOR_FLEXIBLE "
				+ " WHERE TCS_TIPO_VALOR_FLEX.CODIGO = ? AND TCS_VALOR_FLEXIBLE.TVF_CODIGO = ? "
				+ " AND TCS_VALOR_FLEXIBLE.VIGENCIA='S' "
				+ " AND TCS_VALOR_FLEXIBLE.DESCRIPCION LIKE ? "
				+ " ORDER BY CODIGOVFL";

		try {
			pstmt = conn.prepareStatement(strSQL);
			pstmt.setInt(1, dominio);
			pstmt.setInt(2, dominio);
			pstmt.setString(3, "%" + nombre + "%");
			rst = pstmt.executeQuery();

			while (rst.next()) {
				ValorFlexibleVO valorfl = new ValorFlexibleVO();
				valorfl.setCodigotvfl(rst.getString("TVFCOD"));
				valorfl.settVFCodigo(rst.getString("VFTVFCOD"));
				valorfl.setDescripciontvfl(rst.getString("TVFDES"));
				valorfl.setDescripcionvf(rst.getString("VFDES"));
				valorfl.setVigenciatvfl(rst.getString("TVFVIG"));
				valorfl.setCodigovfl(rst.getString("CODIGOVFL"));
				valorfl.setCodigoValor(rst.getString("CODIGO_VALOR"));
				listaDominio.add(valorfl);
			}
			return listaDominio;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public Collection<String> GetTvflAtri(String codigo) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		int iCodatri = Integer.parseInt(codigo.trim());
		List<String> lista = new ArrayList<String>();
		String strSQL = "SELECT TTVF_CODIGO_DOMINIO, CAMPO_A1 FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE CODIGO = ? ";

		try {
			pstmt = conn.prepareStatement(strSQL);
			pstmt.setInt(1, iCodatri);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				lista.add(rst.getString("TTVF_CODIGO_DOMINIO"));
				lista.add(rst.getString("CAMPO_A1"));
			}
			return lista;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	// TODO: preparedstatement
	public Collection<Atributo> getAtriValidarLista(List<String> lNombre,
			String strSubprograma) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		int sub = Integer.parseInt(strSubprograma.trim());
		int iTam = lNombre.size();

		List<Atributo> lDominio = new ArrayList<Atributo>();
		List<Object> parameters = new ArrayList<Object>();
		parameters.add(sub);

		// String parte1 = "IN(";
		String parte2 = "";
		for (int i = 0; i < iTam; i++) {
			String b = (String) lNombre.get(i);
			if (i < iTam - 1) {
				parte2 += " UPPER(?), ";
				parameters.add(b);
			} else {
				parte2 += " UPPER(?)) ";
				parameters.add(b);
			}

		}
		// parte1 = parte1 + parte2;

		String strSQL = "SELECT CODIGO, ETIQUETA, VALIDAR_LISTA FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE SBPR_CODIGO = ? "
				+ " AND NOMBRE IN( " + parte2 + " AND VALIDAR_LISTA='S' ";

		try {
			pstmt = conn.prepareStatement(strSQL);
			pstmt = setQueryParameters(pstmt, parameters);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				Atributo a1 = new Atributo();
				a1.setCodigo(rst.getString("CODIGO"));
				a1.setEtiqueta(rst.getString("ETIQUETA"));
				a1.setValLista(rst.getString("VALIDAR_LISTA"));
				lDominio.add(a1);
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return lDominio;
	}

	public Collection<Atributo> getAtriValidarLista2(List<String> lNombre,
			String strSubprograma) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		int sub = Integer.parseInt(strSubprograma.trim());
		// int iTam = lNombre.size();

		List<Atributo> lDominio = new ArrayList<Atributo>();
		/*
		 * String Parte1 = "IN("; String parte2 = ""; for (int i = 0; i < iTam;
		 * i++) { String b = (String) lNombre.get(i); if (i < iTam - 1) { parte2
		 * += "'" + b + "',"; } else { parte2 += "'" + b + "')"; }
		 * 
		 * } Parte1 = Parte1 + parte2;
		 */

		String strSQL = "SELECT CODIGO, ETIQUETA, VALIDAR_LISTA FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE SBPR_CODIGO = ? "
				+ " AND VALIDAR_LISTA='S' AND TTVF_CODIGO_DOMINIO IS NULL";

		try {
			pstmt = conn.prepareStatement(strSQL);
			pstmt.setInt(1, sub);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				Atributo a1 = new Atributo();
				a1.setCodigo(rst.getString("CODIGO"));
				a1.setEtiqueta(rst.getString("ETIQUETA"));
				a1.setValLista(rst.getString("VALIDAR_LISTA"));

				lDominio.add(a1);
			}
			return lDominio;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public int InsertAtributo(String[] strArr, String strSubprograma) {
		PreparedStatement pstmt = null;

		int sub = Integer.parseInt(strSubprograma.trim());
		String strSql = "INSERT INTO TCS_BEN_SUBP_ATR_BENEFICIARIO (CODIGO, SBPR_CODIGO, "
				+ " TIPO_ATRIBUTO, NOMBRE, DESCRIPCION, ORDEN, TIPO_DATO, LONGITUD, "
				+ " OBLIGATORIO, ETIQUETA, VALIDAR_LISTA, VIGENCIA, "
				+ " usuario_crea, fecha_crea, terminal_crea, usuario_modifica, fecha_modifica, terminal_modifica) "
				+ " VALUES(SCS_BEN_SAB.NEXTVAL, ?, ?, UPPER(?), UPPER(?), ?, ?, ?, ?, UPPER(?), ?, 'A', ?, TO_DATE(?,'dd/mm/yyyy'), ?, ?, TO_DATE(?,'dd/mm/yyyy'), ?)";
		int bInsertoCorrectamente = 0;

		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setInt(1, sub);
			pstmt.setString(2, strArr[0]); // tipo_atributo
			pstmt.setString(3, strArr[1]);// nombre
			pstmt.setString(4, strArr[2]);// descripcion
			pstmt.setString(5, strArr[3]);// orden
			pstmt.setString(6, strArr[4]);// tipo_dato
			pstmt.setString(7, strArr[5]);// longitud
			pstmt.setString(8, strArr[6]);// obligatorio
			pstmt.setString(9, strArr[7]);// etiqueta
			pstmt.setString(10, strArr[8]);// validar_lista
			pstmt.setString(11, strArr[9]);// usuario_crea
			pstmt.setString(12, strArr[10]);// fecha_crea
			pstmt.setString(13, strArr[11]);// terminal_crea
			pstmt.setString(14, strArr[12]);// usuario_modifica
			pstmt.setString(14, strArr[13]);// fecha_modifica
			pstmt.setString(15, strArr[14]);// terminal_modifica

			bInsertoCorrectamente = pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
		return bInsertoCorrectamente;
	}

	public int InsertAtributo2(String[] strArrAG, String strSubprograma) {
		PreparedStatement pstmt = null;

		int sub = Integer.parseInt(strSubprograma.trim());
		String strSql = "INSERT INTO TCS_BEN_SUBP_ATR_BENEFICIARIO (CODIGO, SBPR_CODIGO, TIPO_ATRIBUTO, "
				+ " NOMBRE, ORDEN, LONGITUD, OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, VALIDAR_LISTA, "
				+ " VIGENCIA, TTVF_CODIGO_DOMINIO, DESCRIPCION, TIPO_DATO, CAMPO_A2, "
				+ " usuario_crea, fecha_crea, terminal_crea, usuario_modifica, fecha_modifica, terminal_modifica) "
				+ " VALUES ( SCS_BEN_SAB.NEXTVAL, ? "
				+ ", ?, UPPER(?), ?, ?, ?, UPPER(?), ?, ?, ?, ?, UPPER(?), ?, ?, ?, TO_DATE(?,'dd/mm/yyyy'), ?, ?, TO_DATE(?,'dd/mm/yyyy'), ?)";
		int bInsertoBien = 0;

		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setInt(1, sub);
			pstmt.setString(2, strArrAG[0]);// tipo_atributo
			pstmt.setString(3, strArrAG[1]);// nombre
			pstmt.setString(4, strArrAG[2]);// orden
			pstmt.setString(5, strArrAG[3]);// longitud
			pstmt.setString(6, strArrAG[4]);// obligatorio
			pstmt.setString(7, strArrAG[5]);// etiqueta
			pstmt.setString(8, strArrAG[6]);// valor_sugerido
			pstmt.setString(9, strArrAG[7]);// validar_lista
			pstmt.setString(10, strArrAG[8]);// vigencia
			pstmt.setString(11, strArrAG[9]);// ttvf_codigo_dominio
			pstmt.setString(12, strArrAG[10]);// descripcion
			pstmt.setString(13, strArrAG[11]);// tipo_dato
			pstmt.setString(14, strArrAG[12]);// campo_a2
			pstmt.setString(15, strArrAG[13]);// usuario_crea
			pstmt.setString(16, strArrAG[14]);// fecha_crea
			pstmt.setString(17, strArrAG[15]);// terminal_crea
			pstmt.setString(18, strArrAG[16]);// usuario_modifica
			pstmt.setString(19, strArrAG[17]);// fecha_modifica
			pstmt.setString(20, strArrAG[18]);// terminal_modifica

			bInsertoBien = pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
		return bInsertoBien;
	}

	public int InsertAtributoGenerico(String strCodigo, String strSubprograma,
			String[] strArr2) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		int bInsertoBien = 0;
		String strSql = "SELECT TIPO_ATRIBUTO, NOMBRE, DESCRIPCION, ORDEN, TIPO_DATO, "
				+ " LONGITUD, OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, "
				+ " VALIDAR_LISTA, VIGENCIA, TTVF_CODIGO_DOMINIO, CAMPO_A2 "
				+ " FROM TCS_BEN_ATR_GENERICO WHERE CODIGO = ? ";
		String strTipoAtributo;
		String strNombre;
		String strOrden;
		String strLongitud;
		String strObligatorio;
		String strEtiqueta;
		String strValidarLista;
		String strDescripcion;
		String strTipoDato;
		String strValorSugerido;
		String strVigencia;
		String strTVflCodigo;
		String strCampoA2;

		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setString(1, strCodigo);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				strTipoAtributo = rst.getString("TIPO_ATRIBUTO");
				strNombre = rst.getString("NOMBRE");
				strOrden = rst.getString("ORDEN");
				strLongitud = rst.getString("LONGITUD");
				strObligatorio = rst.getString("OBLIGATORIO");
				strEtiqueta = rst.getString("ETIQUETA");
				strValidarLista = rst.getString("VALIDAR_LISTA");
				strDescripcion = rst.getString("DESCRIPCION");
				strTipoDato = rst.getString("TIPO_DATO");
				strValorSugerido = rst.getString("VALOR_SUGERIDO");
				strVigencia = rst.getString("VIGENCIA");
				strTVflCodigo = rst.getString("TTVF_CODIGO_DOMINIO");
				strCampoA2 = rst.getString("CAMPO_A2");

				String strArrAG[] = { strTipoAtributo, strNombre, strOrden,
						strLongitud, strObligatorio, strEtiqueta,
						strValorSugerido, strValidarLista, strVigencia,
						strTVflCodigo, strDescripcion, strTipoDato, strCampoA2,
						strArr2[0], strArr2[1], strArr2[2], strArr2[3],
						strArr2[4], strArr2[5] };

				bInsertoBien = InsertAtributo2(strArrAG, strSubprograma);
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return bInsertoBien;
	}

	public int InsertTipoVFL(String[] strArr) {
		PreparedStatement pstmt = null;

		String strSql = "INSERT INTO paoyer.TCS_TIPO_VALOR_FLEX (CODIGO, NOMBRE, "
				+ " DESCRIPCION, VIGENCIA,CODIGO_VALOR_AUT, APL_CODIGO, "
				+ " usuario_crea, fecha_crea, terminal_crea, usuario_modifica, fecha_modifica, terminal_modifica) "
				+ " VALUES(paoyer.SCS_TIPO_VALOR_FLEX.NEXTVAL, UPPER(?), UPPER(?), ?, 'S', 20, ?, TO_DATE(?, 'dd/mm/yyyy'), ?, ?, TO_DATE(?, 'dd/mm/yyyy'), ?)";
		List<String> parameters = Arrays.asList(strArr);

		int bInsertoCorrectamente = 0;
		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt = setQueryParameters(pstmt, parameters);

			bInsertoCorrectamente = pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
		return bInsertoCorrectamente;
	}

	public int InsertAtributoGene(String[] strArr) {
		PreparedStatement pstmt = null;

		String strSql = "INSERT INTO TCS_BEN_ATR_GENERICO(CODIGO, TIPO_ATRIBUTO, "
				+ " NOMBRE, DESCRIPCION,ORDEN, TIPO_DATO, LONGITUD, OBLIGATORIO, "
				+ " ETIQUETA, VALIDAR_LISTA, VIGENCIA, "
				+ " usuario_crea, fecha_crea, terminal_crea, usuario_modifica, fecha_modifica, terminal_modifica) "
				+ " VALUES(SCS_BEN_ATGE.NEXTVAL, ?, UPPER(?), UPPER(?), ?, ?, ?, ?, UPPER(?), ?, 'A', ?, TO_DATE(?, 'dd/mm/yyyy'), ?, ?, TO_DATE(?, 'dd/mm/yyyy'), ?)";
		List<String> parameters = Arrays.asList(strArr);
		int bInsertoCorrectamente = 0;
		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt = setQueryParameters(pstmt, parameters);
			bInsertoCorrectamente = pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}

		return bInsertoCorrectamente;
	}

	public int InsertValorVFL(String[] strArr, int codigo) {
		PreparedStatement pstmt = null;

		String strSql = " INSERT INTO paoyer.TCS_VALOR_FLEXIBLE (CODIGO, NOMBRE, DESCRIPCION, VIGENCIA, TVF_CODIGO, "
				+ " usuario_crea, fecha_crea, terminal_crea, usuario_modifica, fecha_modifica, terminal_modifica, CODIGO_VALOR) "
				+ " VALUES(paoyer.SCS_VALOR_FLEXIBLE.NEXTVAL, UPPER(?), UPPER(?), 'S', ? "
				+ ", ?, TO_DATE(?, 'dd/mm/yyyy'), ?, ?, TO_DATE(?, 'dd/mm/yyyy'), ?, ?)";

		int bInsertoCorrectamente = 0;
		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setString(1, strArr[0]);// nombre
			pstmt.setString(2, strArr[1]);// descripcion
			pstmt.setInt(3, codigo); // tvf_codigo
			pstmt.setString(4, strArr[2]);// usuario_crea
			pstmt.setString(5, strArr[3]);// fecha_crea
			pstmt.setString(6, strArr[4]);// terminal_crea
			pstmt.setString(7, strArr[5]);// usuario_modifica
			pstmt.setString(8, strArr[6]);// fecha_modifica
			pstmt.setString(9, strArr[7]);// terminal_modifica
			pstmt.setString(10, strArr[8]);// codigo_valor

			bInsertoCorrectamente = pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
		return bInsertoCorrectamente;
	}

	public int getCodigoTipoVFL() {
		Statement stmt = null;
		ResultSet rst = null;

		int codigo = 0;
		String strSql = " SELECT MAX(CODIGO) CODIGO FROM paoyer.TCS_TIPO_VALOR_FLEX";

		try {
			stmt = conn.createStatement();
			rst = stmt.executeQuery(strSql);

			while (rst.next()) {
				codigo = rst.getInt("CODIGO");
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, stmt);
		}
		return codigo;
	}

	public int getOrdenAtriGene() {
		Statement stmt = null;
		ResultSet rst = null;

		int codigo = 0;
		String strSql = " SELECT MAX(ORDEN) ORDEN FROM TCS_BEN_ATR_GENERICO";

		try {
			stmt = conn.createStatement();
			rst = stmt.executeQuery(strSql);

			if (rst.next()) {
				codigo = rst.getInt("ORDEN") + 5;
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, stmt);
		}
		return codigo;
	}

	public Collection<String> CodMaxAtriGene() {
		Statement stmt = null;
		ResultSet rst = null;

		List<String> codigo = new ArrayList<String>();
		String strSql = " SELECT MAX(SAB.CODIGO) CODIGOATE, MAX(ATG.CODIGO) CODIGOATG "
				+ " FROM TCS_BEN_ATR_GENERICO ATG, TCS_BEN_SUBP_ATR_BENEFICIARIO SAB";

		try {
			stmt = conn.createStatement();
			rst = stmt.executeQuery(strSql);

			while (rst.next()) {
				codigo.add(rst.getString("CODIGOATE"));
				codigo.add(rst.getString("CODIGOATG"));
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, stmt);
		}
		return codigo;
	}

	public int getOrden(String Orden, String Subprograma, String vigencia) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		int iOrden = Integer.parseInt(Orden.trim());
		int iSubpro = Integer.parseInt(Subprograma.trim());
		int opcion = 0;
		String strSql = " SELECT CODIGO FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE ORDEN = ? "
				+ " AND SBPR_CODIGO = ? AND VIGENCIA = ? ";
		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setInt(1, iOrden);
			pstmt.setInt(2, iSubpro);
			pstmt.setString(3, vigencia);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				opcion = rst.getInt("CODIGO");
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return opcion;
	}

	public int getOrden(String Orden, String Subprograma) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		int iOrden = Integer.parseInt(Orden.trim());
		int iSubpro = Integer.parseInt(Subprograma.trim());
		int opcion = 0;
		String strSql = " SELECT CODIGO FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE ORDEN = ? AND SBPR_CODIGO = ? ";

		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setInt(1, iOrden);
			pstmt.setInt(2, iSubpro);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				opcion = rst.getInt("CODIGO");
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return opcion;
	}

	public int getNombre(String Nombre, String Subprograma, String vigencia) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		int iSubpro = Integer.parseInt(Subprograma.trim());
		int opcion = 0;
		String strSql = " SELECT NOMBRE FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE NOMBRE = ? '"
				+ " AND SBPR_CODIGO = ? AND VIGENCIA = ? ";

		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setString(1, Nombre);
			pstmt.setInt(2, iSubpro);
			pstmt.setString(3, vigencia);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				opcion = 1;
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return opcion;
	}

	public int getNombre(String Nombre, String Subprograma) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		int iSubpro = Integer.parseInt(Subprograma.trim());
		int opcion = 0;
		String strSql = " SELECT NOMBRE FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE NOMBRE = ? AND SBPR_CODIGO = ? ";

		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setString(1, Nombre);
			pstmt.setInt(2, iSubpro);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				opcion = 1;
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return opcion;
	}

	public int ActualizarAtributo(String strCodigoAtri, int iCodigo,
			String[] strArrAct) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		int actualizo = 0;
		int codatri = Integer.parseInt(strCodigoAtri.trim());
		String strSql = " UPDATE TCS_BEN_SUBP_ATR_BENEFICIARIO SET "
				+ " TTVF_CODIGO_DOMINIO = ?, usuario_modifica = ?, "
				+ " fecha_modifica = TO_DATE(?, 'dd/mm/yyyy'), "
				+ " terminal_modifica = ? WHERE CODIGO = ? ";

		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setInt(1, iCodigo);// ttvf_codigo_dominio
			pstmt.setString(2, strArrAct[0]);// usuario_modifica
			pstmt.setString(3, strArrAct[1]);// fecha_modifica
			pstmt.setString(4, strArrAct[2]);// terminal_modifica
			pstmt.setInt(5, codatri); // codigo

			actualizo = pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return actualizo;
	}

	public int ActualizarAtributoGene(int iCodigoAtri, int iCodigo,
			String[] strArrAct) {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		int actualizo = 0;
		String strSql = "UPDATE TCS_BEN_ATR_GENERICO SET "
				+ " TTVF_CODIGO_DOMINIO = ?, usuario_modifica = ?,"
				+ " fecha_modifica = TO_DATE(?, 'dd/mm/yyyy'), "
				+ " terminal_modifica = ? WHERE CODIGO = ? ";
		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setInt(1, iCodigo);
			pstmt.setString(2, strArrAct[0]);// usuario_modifica
			pstmt.setString(3, strArrAct[1]);// fecha_modifica
			pstmt.setString(4, strArrAct[2]);// terminal_modifica
			pstmt.setInt(5, iCodigoAtri);

			actualizo = pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return actualizo;
	}

	public int ActualizarCampoUno(int iCodAtriEsp, int iCodAtriGene) {
		PreparedStatement pstmt = null;

		int actualizo = 0;
		String strSql = " UPDATE TCS_BEN_SUBP_ATR_BENEFICIARIO SET CAMPO_A1 = ? WHERE CODIGO = ? ";
		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setInt(1, iCodAtriGene);
			pstmt.setInt(2, iCodAtriEsp);

			actualizo = pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
		return actualizo;
	}

	public int ActulizarValorSug(String strCodigoAtri, String strCodigoVFL,
			String[] strArrAct) {
		PreparedStatement pstmt = null;

		int actualizo = 0;
		int codatri = Integer.parseInt(strCodigoAtri.trim());
		String strSql = "UPDATE TCS_BEN_SUBP_ATR_BENEFICIARIO SET "
				+ " VALOR_SUGERIDO = ?, usuario_modifica = ?,"
				+ " fecha_modifica = TO_DATE(?, 'dd/mm/yyyy'), "
				+ " terminal_modifica = ? WHERE CODIGO = ? ";

		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setString(1, strCodigoVFL);
			pstmt.setString(2, strArrAct[0]);// usuario_modifica
			pstmt.setString(3, strArrAct[1]);// fecha_modifica
			pstmt.setString(4, strArrAct[2]);// terminal_modifica
			pstmt.setInt(5, codatri);

			actualizo = pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
		return actualizo;
	}

	public int ActulizarValorSugGene(int CodigoAtriGe, String strCodigoVFL) {
		PreparedStatement pstmt = null;

		int actualizo = 0;
		String strSql = "UPDATE TCS_BEN_ATR_GENERICO SET VALOR_SUGERIDO = ? WHERE CODIGO = ? ";
		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setString(1, strCodigoVFL);
			pstmt.setInt(2, CodigoAtriGe);

			actualizo = pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
		return actualizo;
	}

	public int EliminarAtri(String strCodigoAtri, String[] strArrAct) {
		PreparedStatement pstmt = null;

		int actualizo = 0;
		int codatri = Integer.parseInt(strCodigoAtri.trim());
		String strSql = "UPDATE TCS_BEN_SUBP_ATR_BENEFICIARIO SET "
				+ " VIGENCIA = 'I', usuario_modifica = ?, "
				+ " fecha_modifica = TO_DATE(?, 'dd/mm/yyyy'), "
				+ " terminal_modifica = ? WHERE CODIGO = ? ";

		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setString(1, strArrAct[0]);// usuario_modifica
			pstmt.setString(2, strArrAct[1]);// fecha_modifica
			pstmt.setString(3, strArrAct[2]);// terminal_modifica
			pstmt.setInt(4, codatri);

			actualizo = pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
		return actualizo;
	}

	// TODO:revisar bien
	public int ModificarAtriSub(Atributo Atri, String[] strArrAct) {
		PreparedStatement pstmt = null;

		int actualizo = 0;
		String strSql = "UPDATE TCS_BEN_SUBP_ATR_BENEFICIARIO SET "
				+ " NOMBRE = UPPER(?), ORDEN = ?, LONGITUD = ?, "
				+ " OBLIGATORIO = ?, ETIQUETA = UPPER(?), "
				+ " VALOR_SUGERIDO = ?, VALIDAR_LISTA = ?, "
				+ " VIGENCIA = ?, DESCRIPCION = UPPER(?), "
				+ " usuario_modifica = ?,"
				+ " fecha_modifica = TO_DATE(?,'dd/mm/yyyy'), "
				+ " terminal_modifica = ? WHERE CODIGO = ? ";

		/*
		 * String parArr[] = { Atri.getNombre(), Atri.getOrden(),
		 * Atri.getLongitud(), Atri.getObligatorio(), Atri.getEtiqueta(),
		 * Atri.getValorsugerido(), Atri.getValLista(), Atri.getVigencia(),
		 * Atri.getDescripcion(), strArrAct[0], strArrAct[1], strArrAct[2] };
		 */

		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setString(1, Atri.getNombre());
			pstmt.setString(2, Atri.getOrden());
			pstmt.setString(3, Atri.getLongitud());
			pstmt.setString(4, Atri.getObligatorio());
			pstmt.setString(5, Atri.getEtiqueta());
			pstmt.setString(6, Atri.getValorsugerido());
			pstmt.setString(7, Atri.getValLista());
			pstmt.setString(8, Atri.getVigencia());
			pstmt.setString(9, Atri.getDescripcion());
			pstmt.setString(10, strArrAct[0]);
			pstmt.setString(11, strArrAct[1]);
			pstmt.setString(12, strArrAct[2]);
			pstmt.setString(13, Atri.getCodatributo());

			actualizo = pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}

		CallableStatement cs = null;

		strSql = "{call PCS_CHANGE_DATA_TYPE(?, ?, ?)}";
		try {
			cs = conn.prepareCall(strSql);
			cs.setString(1, Atri.getTipodato());
			cs.setString(2, Atri.getCodatributo());
			cs.registerOutParameter(3, Types.INTEGER);
			cs.execute();

			if (cs.getInt(3) != 1) {
				actualizo = -1;
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(cs);
		}

		strSql = "{call PCS_CHANGE_ATRIBUTE_TYPE(?, ?, ?, ?, ?)}";
		try {
			cs = conn.prepareCall(strSql);
			cs.setString(1, Atri.getTipoatributo());
			cs.setString(2, Atri.getCodatributo());
			cs.setString(3, strArrAct[0]);
			cs.setString(4, strArrAct[2]);
			cs.registerOutParameter(5, Types.INTEGER);
			cs.execute();

			if (cs.getInt(5) != 1) {
			} else {
				actualizo = -2;
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(cs);
		}

		return actualizo;
	}

	public int ActualizarTvfDominio(String Atri) {
		PreparedStatement pstmt = null;

		int actualizo = 0;
		int codatri = Integer.parseInt(Atri.trim());
		String strSql = "UPDATE TCS_BEN_SUBP_ATR_BENEFICIARIO SET "
				+ "TTVF_CODIGO_DOMINIO='', VALOR_SUGERIDO='', "
				+ "CAMPO_A1='' WHERE CODIGO = ? ";

		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setInt(1, codatri);

			actualizo = pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
		return actualizo;
	}

	public int ActualizarDominio(String[] strArr, String Codigo) {
		PreparedStatement pstmt = null;

		int actualizo = 0;
		int codtvfl = Integer.parseInt(Codigo.trim());
		String strSql = "UPDATE paoyer.TCS_TIPO_VALOR_FLEX SET "
				+ " NOMBRE = upper(?), DESCRIPCION = UPPER(?), "
				+ " VIGENCIA = ?, usuario_modifica = ?, "
				+ " fecha_modifica = TO_DATE(?,'dd/mm/yyyy'), "
				+ " TERMINAL_MODIFICA = ? WHERE CODIGO = ? ";

		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setString(1, strArr[0]);// nombre
			pstmt.setString(2, strArr[1]);// descripcion
			pstmt.setString(3, strArr[2]);// vigencia
			pstmt.setString(4, strArr[3]);// usuario_modifica
			pstmt.setString(5, strArr[4]);// fecha_modifica
			pstmt.setString(6, strArr[5]);// terminal_modifica
			pstmt.setInt(7, codtvfl);// codigo

			actualizo = pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
		return actualizo;
	}

	public int ActualizarValorFlexible(String[] strArr, String Codigo) {
		PreparedStatement pstmt = null;

		int actualizo = 0;
		int codvfl = Integer.parseInt(Codigo.trim());
		String strSql = "UPDATE paoyer.TCS_VALOR_FLEXIBLE SET "
				+ " NOMBRE = upper(?), DESCRIPCION = upper(?), "
				+ " VIGENCIA = ?, usuario_modifica = ?,"
				+ " fecha_modifica = TO_DATE(?, 'dd/mm/yyyy'), "
				+ " terminal_modifica = ?, codigo_valor = ? "
				+ " WHERE CODIGO = ? ";

		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setString(1, strArr[0]);// nombre
			pstmt.setString(2, strArr[1]);// descripcion
			pstmt.setString(3, strArr[2]);// vigencia
			pstmt.setString(4, strArr[3]);// usuario_modifica
			pstmt.setString(5, strArr[4]);// fecha_modifica
			pstmt.setString(6, strArr[5]);// terminal_modifica
			pstmt.setString(7, strArr[6]);// codigo_valor
			pstmt.setInt(8, codvfl);// codigo

			actualizo = pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
		return actualizo;
	}

	public int EliminarVFL(String Codigo) {
		PreparedStatement pstmt = null;

		int actualizo = 0;
		int codvfl = Integer.parseInt(Codigo.trim());
		String strSql = "UPDATE paoyer.TCS_VALOR_FLEXIBLE SET "
				+ " VIGENCIA='N' WHERE CODIGO = ? ";
		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setInt(1, codvfl);

			actualizo = pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
		return actualizo;
	}

	public int EliminarVFLTotal(String Codigo) {
		PreparedStatement pstmt = null;

		int bInsertoCorrectamente = 0;
		int codtvfl = Integer.parseInt(Codigo.trim());
		String strSql = "UPDATE paoyer.TCS_VALOR_FLEXIBLE SET "
				+ " VIGENCIA='N' WHERE TVF_CODIGO = ? ";

		try {
			pstmt = conn.prepareStatement(strSql);
			pstmt.setInt(1, codtvfl);

			bInsertoCorrectamente = pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
		return bInsertoCorrectamente;
	}

	public Connection getConn() {
		return conn;
	}
}
